package com.stylefeng.guns.core.util;

import cn.hutool.core.thread.ThreadUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * Created by deng_wb on 2020/2/25
 * 令牌桶,对业务峰值由一定的容忍度
 */
@Slf4j
public class TokenBucket {

    private  int bucketNums = 100;   // 桶的容量
    private  int rate = 1;   // 流入速度 每毫秒一个
    private  int nowTokens;  // 当前令牌数量
    private  long timestamp = getNowTime();    // 时间


    private  long getNowTime() {
        return System.currentTimeMillis();
    }

    private  int min(int tokens) {
        if (bucketNums > tokens)
            return tokens;
        return bucketNums;
    }

    /**
     * 获取令牌通行
     *
     * @return
     */
    public  boolean getToken() {
        // 记录来拿令牌的时间
        long nowTime = getNowTime();
        // 添加令牌 [判断该有多少个令牌]
        nowTokens = nowTokens + (int) ((nowTime - timestamp) * rate);
        // 添加以后的令牌数量与桶的容量哪个小
        nowTokens = min(nowTokens);
//        log.error("当前令牌数量: {}", nowTokens);
        // 修改拿令牌的时间
        timestamp = nowTime;
        // 判断令牌是否足够
        if (nowTokens < 1) {
            return false;
        }
        nowTokens--;
        return true;

    }



}
